KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jruby > internal > runtime > methods > DynamicMethod


1 /***** BEGIN LICENSE BLOCK *****
2  * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Common Public
5  * License Version 1.0 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.eclipse.org/legal/cpl-v10.html
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * Copyright (C) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de>
15  * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se>
16  * Copyright (C) 2005 Thomas E Enebo <enebo@acm.org>
17  *
18  * Alternatively, the contents of this file may be used under the terms of
19  * either of the GNU General Public License Version 2 or later (the "GPL"),
20  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
21  * in which case the provisions of the GPL or the LGPL are applicable instead
22  * of those above. If you wish to allow use of your version of this file only
23  * under the terms of either the GPL or the LGPL, and not to allow others to
24  * use your version of this file under the terms of the CPL, indicate your
25  * decision by deleting the provisions above and replace them with the notice
26  * and other provisions required by the GPL or the LGPL. If you do not delete
27  * the provisions above, a recipient may use your version of this file under
28  * the terms of any one of the CPL, the GPL or the LGPL.
29  ***** END LICENSE BLOCK *****/

30 package org.jruby.internal.runtime.methods;
31
32 import org.jruby.RubyModule;
33 import org.jruby.runtime.Arity;
34 import org.jruby.runtime.Block;
35 import org.jruby.runtime.CallType;
36 import org.jruby.runtime.ThreadContext;
37 import org.jruby.runtime.Visibility;
38 import org.jruby.runtime.builtin.IRubyObject;
39
40 /**
41  *
42  * @author jpetersen
43  */

44 public abstract class DynamicMethod {
45     protected RubyModule implementationClass;
46     protected Visibility visibility;
47     private boolean implIsClass;
48     private boolean implIsKernel;
49     
50     protected DynamicMethod(RubyModule implementationClass, Visibility visibility) {
51         this.visibility = visibility;
52         this.implementationClass = implementationClass;
53         if (implementationClass != null) {
54             this.implIsClass = implementationClass.isClass();
55             this.implIsKernel = implementationClass == implementationClass.getRuntime().getKernel();
56         }
57     }
58
59     /**
60      * Call the method
61      * @param context is the thread-specific information that this method is being invoked on
62      * @param receiver
63      */

64     public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz,
65             String JavaDoc name, IRubyObject[] args, boolean noSuper, Block block) {
66         preMethod(context, clazz, self, name, args, noSuper, block);
67
68         try {
69             return internalCall(context, clazz, self, name, args, noSuper, block);
70         } finally {
71             postMethod(context);
72         }
73     }
74     
75     protected abstract void postMethod(ThreadContext context);
76     protected abstract IRubyObject internalCall(ThreadContext context, RubyModule clazz, IRubyObject self, String JavaDoc name, IRubyObject[] args, boolean noSuper, Block block);
77     protected abstract void preMethod(ThreadContext context, RubyModule clazz, IRubyObject self, String JavaDoc name, IRubyObject[] args, boolean noSuper, Block block);
78     public abstract DynamicMethod dup();
79
80     public boolean isCallableFrom(IRubyObject caller, CallType callType) {
81         if (getVisibility().isPrivate() && (callType == CallType.NORMAL)) {
82             return false;
83         } else if (getVisibility().isProtected()) {
84             RubyModule defined = getImplementationClass();
85             while (defined.isIncluded()) {
86                 defined = defined.getMetaClass();
87             }
88             if (!caller.isKindOf(defined)) {
89                 return false;
90             }
91         }
92         
93         return true;
94     }
95     
96     public boolean needsImplementer() {
97         return !(implIsClass || implIsKernel);
98     }
99     
100     public String JavaDoc getOriginalName() {
101         return null;
102     }
103     
104     public RubyModule getImplementationClass() {
105         return implementationClass;
106     }
107
108     public void setImplementationClass(RubyModule implClass) {
109         implementationClass = implClass;
110     }
111
112     public Visibility getVisibility() {
113         return visibility;
114     }
115
116     public void setVisibility(Visibility visibility) {
117         this.visibility = visibility;
118     }
119
120     public boolean isUndefined() {
121         return false;
122     }
123
124     public Arity getArity() {
125         return Arity.optional();
126     }
127 }
128
Popular Tags