blob: 6f14b965fb8814a4cd95dbf21da91d2e56b801b0 [file] [log] [blame]
/*
* Copyright 2003-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package groovy.lang;
import java.util.List;
/**
* <p>An interface that defines the API usable by clients of Groovy's Meta Object Protocol (MOP). These methods are
* implemented by the reference implementation of the @link groovy.lang.MetaClass interface.</p>
*
* @see MetaClassImpl
*
* @author John Wilson
* @author Graeme Rocher
*/
public interface MetaObjectProtocol {
/**
* Obtain a list of all meta properties available on this meta class
*
* @see groovy.lang.MetaBeanProperty
* @return A list of MetaBeanProperty instances
*/
List getProperties();
/**
* Obtain a list of all the meta methods available on this meta class
*
* @see groovy.lang.MetaMethod
* @return A list of MetaMethod instances
*/
List getMethods();
/**
* <p>Returns true if the implementing MetaClass responds a method with the given name and arguments types
*
* <p>Note that this method will only return true for realised methods and does not take into account
* objects or classes that implement invokeMethod or methodMissing
*
* <p>This method is "safe" and will always return a boolean and never throw an exception
*
* @param obj The object to inspect
* @param name The name of the method
* @param argTypes The argument types
* @return A List of MetaMethods which is empty if non exist
*/
List respondsTo(Object obj,String name, Object[] argTypes);
/**
* <p>Returns true if the implementing MetaClass responds a method with the given name regardless of
* arguments. In other words this method will return for foo() and foo(String)
*
* <p>Note that this method will only return true for realised methods and does not take into account
* objects or classes that implement invokeMethod or methodMissing
*
* <p>This method is "safe" and will always return a boolean and never throw an exception
*
* @param obj The object to inspect
* @param name The name of the method
* @return A List of MetaMethods which is empty if non exist
*/
List respondsTo(Object obj,String name);
/**
* <p>Returns true of the implementing MetaClass has a property of the given name
*
* <p>Note that this method will only return true for realised properties and does not take into
* account implementation of getProperty or propertyMissing
*
* @param obj The object to inspect
* @param name The name of the property
* @return The MetaProperty or null if it doesn't exist
*/
MetaProperty hasProperty(Object obj, String name);
/**
* Returns a MetaProperty for the given name or null if it doesn't exist
*
* @param name The name of the MetaProperty
* @return A MetaProperty or null
*/
MetaProperty getMetaProperty(String name);
/**
* Retreives a static MetaMethod for the given name and argument values, using the types of the arguments
* to establish the chosen MetaMethod
*
* @param name The name of the MetaMethod
* @param args The argument types
* @return A MetaMethod or null if it doesn't exist
*/
MetaMethod getStaticMetaMethod(String name, Object[] args);
/**
* Retrieves an instance MetaMethod for the given name and argument values, using the types of the
* argument values to establish the chosen MetaMethod
*
* @param name The name of the MetaMethod
* @param args The argument types
* @return A MetaMethod or null if it doesn't exist
*/
MetaMethod getMetaMethod(String name, Object[] args);
/**
* Retrieves that Java Class that the attached Meta behaviours apply to
*
* @return The java.lang.Class instance
*/
Class getTheClass();
/**
* Invokes a constructor for the given arguments. The MetaClass will attempt to pick the best argument which
* matches the types of the objects passed within the arguments array
*
* @param arguments The arguments to the constructor
* @return An instance of the java.lang.Class that this MetaObjectProtocol object applies to
*/
Object invokeConstructor(Object[] arguments);
/**
* <p>Invokes a method on the given Object with the given name and arguments. The MetaClass will attempt to pick
* the best method for the given name and arguments. If a method cannot be invoked a MissingMethodException will be
* thrown.</p>
*
*
* @see groovy.lang.MissingMethodException
*
* @param object The instance which the method is invoked on
* @param methodName The name of the method
* @param arguments The arguments to the method
* @return The return value of the method which is null if the return type is void
*/
Object invokeMethod(Object object, String methodName, Object[] arguments);
/**
* <p>Invokes a method on the given object, with the given name and single argument.</p>
*
* @see #invokeMethod(Object, String, Object[])
*
* @param object The Object to invoke the method on
* @param methodName The name of the method
* @param arguments The argument to the method
* @return The return value of the method which is null if the return type is void
*/
Object invokeMethod(Object object, String methodName, Object arguments);
/**
* <p>Invokes a static method on the given Object with the given name and arguments.</p>
*
* <p> The Object can either be an instance of the class that this
* MetaObjectProtocol instance applies to or the java.lang.Class instance itself. If a method cannot be invoked
* a MissingMethodException is will be thrown</p>
*
* @see groovy.lang.MissingMethodException
*
* @param object An instance of the class returned by the getTheClass() method or the class itself
* @param methodName The name of the method
* @param arguments The arguments to the method
* @return The return value of the method which is null if the return type is void
*/
Object invokeStaticMethod(Object object, String methodName, Object[] arguments);
/**
* <p>Retrieves a property of an instance of the class returned by the getTheClass() method. </p>
*
* <p>What this means is largely down to the MetaClass implementation, however the default case would result
* in an attempt to invoke a JavaBean getter, or if no such getter exists a public field of the instance.</p>
*
* @see MetaClassImpl
*
* @param object An instance of the class returned by the getTheClass() method
* @param property The name of the property to retrieve the value for
* @return The properties value
*/
Object getProperty(Object object, String property);
/**
* <p>Sets a property of an instance of the class returned by the getTheClass() method.</p>
*
* <p>What this means is largely down to the MetaClass implementation, however the default case would result
* in an attempt to invoke a JavaBean setter, or if no such setter exists to set a public field of the instance.</p>
*
* @see MetaClassImpl
*
* @param object An instance of the class returned by the getTheClass() method
* @param property The name of the property to set
* @param newValue The new value of the property
*/
void setProperty(Object object, String property, Object newValue);
/**
* <p>Retrieves an attribute of an instance of the class returned by the getTheClass() method. </p>
*
* <p>What this means is largely down to the MetaClass implementation, however the default case would result
* in attempt to read a field of the instance.</p>
*
* @see MetaClassImpl
*
* @param object An instance of the class returned by the getTheClass() method
* @param attribute The name of the attribute to retrieve the value for
* @return The attribute value
*/
Object getAttribute(Object object, String attribute);
/**
* <p>Sets an attribute of an instance of the class returned by the getTheClass() method.</p>
*
* <p>What this means is largely down to the MetaClass implementation, however the default case would result
* in an attempt to set a field of the instance.</p>
*
* @see MetaClassImpl
*
* @param object An instance of the class returned by the getTheClass() method
* @param attribute The name of the attribute to set
* @param newValue The new value of the attribute
*/
void setAttribute(Object object, String attribute, Object newValue);
}