// Path: src/main/java/io/qameta/htmlelements/context/Context.java
// public class Context {
// 
//     public static final String DESCRIPTION_KEY = "description";
// 
//     public static final String LISTENERS_KEY = "listeners";
// 
//     public static final String PROPERTIES_KEY = "properties";
// 
//     public static final String PARAMETERS_KEY = "parameters";
// 
//     public static final String DRIVER_KEY = "driver";
// 
//     private Context parent;
// 
//     private Store store;
// 
//     private ExtensionRegistry registry;
// 
//     private Context() {
//         this.store = new DefaultStore();
//     }
// 
//     public Optional<Context> getParent() {
//         return Optional.ofNullable(parent);
//     }
// 
//     private void setParent(Context parent) {
//         this.parent = parent;
//     }
// 
//     public Store getStore() {
//         return store;
//     }
// 
//     public ExtensionRegistry getRegistry() {
//         return registry;
//     }
// 
//     private void setRegistry(ExtensionRegistry registry) {
//         this.registry = registry;
//     }
// 
//     public Context newChildContext(Method method, Class<?> proxyClass) {
//         Context childContext = new Context();
//         childContext.getStore().put(DESCRIPTION_KEY, ReflectionUtils.getDescription(method, null));
//         childContext.setRegistry(ExtensionRegistry.create(proxyClass));
//         childContext.getRegistry().registerExtensions(method);
//         childContext.setParent(this);
//         //extension
//         getStore().get(PROPERTIES_KEY, Properties.class).ifPresent(properties -> {
//             Properties child = new Properties();
//             child.putAll(properties);
//             childContext.getStore().put(PROPERTIES_KEY, child);
//         });
//         getStore().get(PARAMETERS_KEY, Properties.class).ifPresent(properties -> {
//             Properties child = new Properties();
//             child.putAll(properties);
//             childContext.getStore().put(PARAMETERS_KEY, child);
//         });
//         getStore().get(LISTENERS_KEY, List.class).ifPresent(listeners -> {
//             childContext.getStore().put(LISTENERS_KEY, listeners);
//         });
//         getStore().get(DRIVER_KEY, WebDriver.class).ifPresent(driver -> {
//             childContext.getStore().put(DRIVER_KEY, driver);
//         });
//         return childContext;
//     }
// 
//     public static Context newWebPageContext(Class<?> webPageClass, WebDriver driver) {
//         Context context = new Context();
//         context.setRegistry(ExtensionRegistry.create(webPageClass));
//         context.getStore().put(DESCRIPTION_KEY, ReflectionUtils.getDescription(webPageClass));
//         context.getStore().put(DRIVER_KEY, driver);
//         return context;
//     }
// 
// 
// }


import io.qameta.htmlelements.context.Context;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
package io.qameta.htmlelements.extension;



@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@HandleWith(DefaultMethod.Extension.class)
public @interface DefaultMethod {

    class Extension implements MethodHandler {

        @Override
// Path: src/main/java/io/qameta/htmlelements/context/Context.java
// public class Context {
// 
//     public static final String DESCRIPTION_KEY = "description";
// 
//     public static final String LISTENERS_KEY = "listeners";
// 
//     public static final String PROPERTIES_KEY = "properties";
// 
//     public static final String PARAMETERS_KEY = "parameters";
// 
//     public static final String DRIVER_KEY = "driver";
// 
//     private Context parent;
// 
//     private Store store;
// 
//     private ExtensionRegistry registry;
// 
//     private Context() {
//         this.store = new DefaultStore();
//     }
// 
//     public Optional<Context> getParent() {
//         return Optional.ofNullable(parent);
//     }
// 
//     private void setParent(Context parent) {
//         this.parent = parent;
//     }
// 
//     public Store getStore() {
//         return store;
//     }
// 
//     public ExtensionRegistry getRegistry() {
//         return registry;
//     }
// 
//     private void setRegistry(ExtensionRegistry registry) {
//         this.registry = registry;
//     }
// 
//     public Context newChildContext(Method method, Class<?> proxyClass) {
//         Context childContext = new Context();
//         childContext.getStore().put(DESCRIPTION_KEY, ReflectionUtils.getDescription(method, null));
//         childContext.setRegistry(ExtensionRegistry.create(proxyClass));
//         childContext.getRegistry().registerExtensions(method);
//         childContext.setParent(this);
//         //extension
//         getStore().get(PROPERTIES_KEY, Properties.class).ifPresent(properties -> {
//             Properties child = new Properties();
//             child.putAll(properties);
//             childContext.getStore().put(PROPERTIES_KEY, child);
//         });
//         getStore().get(PARAMETERS_KEY, Properties.class).ifPresent(properties -> {
//             Properties child = new Properties();
//             child.putAll(properties);
//             childContext.getStore().put(PARAMETERS_KEY, child);
//         });
//         getStore().get(LISTENERS_KEY, List.class).ifPresent(listeners -> {
//             childContext.getStore().put(LISTENERS_KEY, listeners);
//         });
//         getStore().get(DRIVER_KEY, WebDriver.class).ifPresent(driver -> {
//             childContext.getStore().put(DRIVER_KEY, driver);
//         });
//         return childContext;
//     }
// 
//     public static Context newWebPageContext(Class<?> webPageClass, WebDriver driver) {
//         Context context = new Context();
//         context.setRegistry(ExtensionRegistry.create(webPageClass));
//         context.getStore().put(DESCRIPTION_KEY, ReflectionUtils.getDescription(webPageClass));
//         context.getStore().put(DRIVER_KEY, driver);
//         return context;
//     }
// 
// 
// }


// Path: src/main/java/io/qameta/htmlelements/extension/DefaultMethod.java
import io.qameta.htmlelements.context.Context;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

package io.qameta.htmlelements.extension;



@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@HandleWith(DefaultMethod.Extension.class)
public @interface DefaultMethod {

    class Extension implements MethodHandler {

        @Override
        public Object handle(Context context, Object proxy, Method method, Object[] args) throws Throwable {