public BoundMethod(Object self, Method method, Object[] parameters) {
        this.self = self;
        this.method = method;
        this.parameters = parameters;

        if (method != null && parameters != null) {
            Class[] methodTypes = method.getParameterTypes();
            if (methodTypes.length != parameters.length) {
                throw new PatternException("Parameters don't match for `" + self.getClass() + "#" + method.getName() + "`");
            }

            for (int i = 0; i < parameters.length; i++) {
                parameters[i] = Lubricant.apply(parameters[i], methodTypes[i]);
            }
        }
    }