anchor.diff:    else if Self is TRttiProperty then
       Result := TRttiProperty(Self).PropertyType
     else if Self is TRttiParameter then
  -    Result := TRttiParameter(Self).ParamType;
  +    Result := TRttiParameter(Self).ParamType
  +  else if Self is TRttiType then
  +    Result := TRttiType(Self);
   end;
   
   function TRttiObjectHelper.HasAttribute<T>(
  -  const ADoSomething: TProc<T>): Boolean;
  +  const ADoSomething: TProc<T>; const AInherited: Boolean): Boolean;
   var
     LAttribute: TCustomAttribute;
  -begin
  -  Result := False;
  -  for LAttribute in Self.GetAttributes do
  -  begin
  -    if LAttribute.InheritsFrom(TClass(T)) then
  +  LResult: Boolean;
  +begin
  +  LResult := False;
  +
  +  ForEachAttribute<T>(
  +    function (AAttr: T): Boolean
       begin
  -      Result := True;
  -
  +      Result := False;
  +      LResult := True;
         if Assigned(ADoSomething) then
  -        ADoSomething(T(LAttribute));
  -
  -      Break;
  -    end;
  -  end;
  +        ADoSomething(AAttr);
  +    end
  +  , AInherited
  +  );
  +
  +  Result := LResult;
   end;
   
   procedure TRttiObjectHelper.SetValue(AInstance: Pointer; const AValue: TValue);
  
positive.code:     function GetRttiType: TRttiType;
      procedure SetValue(AInstance: Pointer; const AValue: TValue);
  
      function HasAttribute<T: TCustomAttribute>: Boolean; overload;
      function HasAttribute<T: TCustomAttribute>(
        const ADoSomething: TProc<T>): Boolean; overload;
      function ForEachAttribute<T: TCustomAttribute>(
        const ADoSomething: TProc<T>): Integer;
    end;
  
    TRttiTypeHelper = class helper(TRttiObjectHelper) for TRttiType
  
negative.code: { TRttiObjectHelper }
  
  function TRttiObjectHelper.ForEachAttribute<T>(
    const ADoSomething: TProc<T>; const AInherited: Boolean): Integer;
  var
    LAttribute: TCustomAttribute;
    LAttributes: TArray<TCustomAttribute>;
    LBaseType: TRttiType;
    LType: TRttiType;
  begin
    Result := 0;
    LAttributes := Self.GetAttributes;
  
    LType := Self.GetRttiType;
    if AInherited and Assigned(LType) then
    begin
      LBaseType := LType.BaseType;
      while Assigned(LBaseType) do
      begin
       LAttributes := LAttributes + LBaseType.GetAttributes;
       LBaseType := LBaseType.BaseType;
      end;
    end;
  
    for LAttribute in LAttributes do
    begin
      if LAttribute.InheritsFrom(TClass(T)) then
      begin
  