code: public InjectionNode analyze(final InjectionSignature signature, final InjectionSignature concreteType, final AnalysisContext context) {
  
          InjectionNode injectionNode;
  
          if (context.isDependent(concreteType.getType())) {
              //if this type is a dependency of itself, we've found a back link.
              //This dependency loop must be broken using a virtual proxy
              injectionNode = context.getInjectionNode(concreteType.getType());
  
              Collection<InjectionNode> loopedDependencies = context.getDependencyHistory();
  
              InjectionNode proxyDependency = findProxyableDependency(injectionNode, loopedDependencies);
  
              if (proxyDependency == null) {
                  throw new TransfuseAnalysisException("Unable to find a dependency to proxy");
              }
  
              VirtualProxyAspect proxyAspect = getProxyAspect(proxyDependency);
              proxyAspect.getProxyInterfaces().add(proxyDependency.getUsageType());
  
          } else {
              injectionNode = new InjectionNode(signature, concreteType);
              //default variable builder
              injectionNode.addAspect(VariableBuilder.class, variableInjectionBuilderProvider.get());
  
              AnalysisContext nextContext = context.addDependent(injectionNode);
  
              //loop over super classes (extension and implements)
              scanClassHierarchy(concreteType.getType(), injectionNode, nextContext);
          }
  
          return injectionNode;
      }
docs: Analyze the given ASTType and produces a corresponding InjectionNode with the contained
  AST injection related elements (constructor, method, field) recursively analyzed for InjectionNodes
  
  @param signature Injection Signature
  @param concreteType required type
  @param context      required
  @return InjectionNode root