summaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/lll/proxies/AbstractProxy.java
blob: 1ee19a8d5835c6028365ccb3f9f4f8fde004d712 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package ftbsc.lll.proxies;

/**
 * Abstract proxy class, implementing common aspects
 * of {@link MethodProxy} and {@link FieldProxy}.
 * @since 0.3.0
 */
public abstract class AbstractProxy {

   /**
    * The name of the corresponding class member.
    */
   private final String name;

   /**
    * The fully qualified name (i.e. java.lang.String) of
    * the parent class.
    */
   private final String parent;

   /**
    * The modifiers of the member, as a packed int.
    * @see java.lang.reflect.Modifier
    */
   private final int modifiers;

   /**
    * @return the name of the item
    */
   public String getName() {
      return this.name;
   }

   /**
    * @return the modifiers of the member, as a packed int
    * @see java.lang.reflect.Modifier
    */
   public int getModifiers() {
      return this.modifiers;
   }

   /**
    * @return the fully qualified name of the parent class
    */
   public String getParent() {
      return this.parent;
   }

   /**
    * @return the descriptor of the member
    */
   public abstract String getDescriptor();

   /**
    * The private constructor, should be called by all classes extending this in theirs.
    * @param name the name of the member
    * @param modifiers the modifiers, as a packed int
    * @param parent the FQN of the parent class
    */
   protected AbstractProxy(String name, int modifiers, String parent) {
      this.name = name;
      this.modifiers = modifiers;
      this.parent = parent;
   }

   /**
    * A Builder for the generic proxy.
    * @param <T> the type of proxy
    */
   public abstract static class Builder<T extends AbstractProxy> {

      /**
       * The name of the member.
       */
      protected final String name;

      /**
       * The modifiers of the member, as a packed int.
       */
      protected int modifiers;

      /**
       * The fully qualified name of the parent.
       */
      protected String parent;

      /**
       * The constructor.
       * @param name the name of the member
       */
      protected Builder(String name) {
         this.name = name;
         this.modifiers = 0;
      }

      /**
       * @param parentFQN the fully qualified name of the parent
       * @return the current state of the builder
       */
      public Builder<T> setParent(String parentFQN) {
         this.parent = parentFQN;
         return this;
      }

      /**
       * @param newModifier the modifier to add
       * @return the current state of the builder
       */
      public Builder<T> addModifier(int newModifier) {
         this.modifiers |= newModifier;
         return this;
      }

      /**
       * @param newModifier the new modifier value
       * @return the current state of the builder
       */
      public Builder<T> setModifier(int newModifier) {
         this.modifiers = newModifier;
         return this;
      }

      /**
       * @return the built proxy object
       */
      public abstract T build();
   }
}