code: public boolean matches(ServiceType serviceType)
      {
          if (serviceType == null) return false;
          if (equals(serviceType)) return true;
  
          if (isAbstractType())
          {
              if (serviceType.isAbstractType())
              {
                  if (!getPrincipleTypeName().equals(serviceType.getPrincipleTypeName())) return false;
                  return getConcreteTypeName().equals(serviceType.getConcreteTypeName());
              }
              else
              {
                  return false;
              }
          }
          else
          {
              if (serviceType.isAbstractType())
              {
                  return getPrincipleTypeName().equals(serviceType.getPrincipleTypeName());
              }
              else
              {
                  return getPrincipleTypeName().equals(serviceType.getPrincipleTypeName());
              }
          }
      }
docs: Matches this service type against the given service type.
  <br />
  If this service types is equal to the given service type, the service types match.
  <br />
  The <code>service:</code> prefix is not influent in matching, so
  <code>service:foo:bar</code> matches <code>foo:bar</code>.
  <br />
  <code>service:foo</code> matches <code>service:foo:bar</code>, <code>foo:bar</code> and <code>foo</code>.
  
  @param serviceType The service type to match against
  @return whether this service type matches the given service type