Property (@Nullable Processor<? super Property> filter) { final PyClassStub stub = getStub(); if (stub != null) { for (StubElement subStub : stub.getChildrenStubs()) { if (subStub.getStubType() == PyElementTypes.TARGET_EXPRESSION) { final PyTargetExpressionStub targetStub = (PyTargetExpressionStub)subStub; final PropertyStubStorage prop = targetStub.getCustomStub(PropertyStubStorage.class); if (prop != null) { final Maybe<PyCallable> getter = fromPacked(prop.getGetter()); final Maybe<PyCallable> setter = fromPacked(prop.getSetter()); final Maybe<PyCallable> deleter = fromPacked(prop.getDeleter()); final String doc = prop.getDoc(); if (getter != NONE || setter != NONE || deleter != NONE) { final PropertyImpl property = new PropertyImpl(targetStub.getName(), getter, setter, deleter, doc, targetStub.getPsi()); if (filter == null || filter.process(property)) return property; } } } } } return null; }