2323
2424class CustomBoundItem <G extends Gui > extends AbstractBoundItem {
2525
26+ private final Class <? extends Gui > guiClass ;
2627 private final TriConsumer <? super Item , ? super G , ? super Click > clickHandler ;
2728 private final QuadConsumer <? super Item , ? super G , ? super Player , ? super Integer > selectHandler ;
2829 private volatile BiFunction <? super Player , ? super G , ? extends ItemProvider > itemProvider ;
@@ -32,13 +33,15 @@ class CustomBoundItem<G extends Gui> extends AbstractBoundItem {
3233 private @ Nullable BukkitTask updateTask ;
3334
3435 public CustomBoundItem (
36+ Class <? extends Gui > guiClass ,
3537 BiConsumer <? super Item , ? super G > bindHandler ,
3638 BiConsumer <? super Item , ? super G > unbindHandler ,
3739 TriConsumer <? super Item , ? super G , ? super Click > clickHandler ,
3840 QuadConsumer <? super Item , ? super G , ? super Player , ? super Integer > selectHandler ,
3941 BiFunction <? super Player , ? super G , ? extends ItemProvider > itemProvider ,
4042 int updatePeriod
4143 ) {
44+ this .guiClass = guiClass ;
4245 this .bindHandler = bindHandler ;
4346 this .unbindHandler = unbindHandler ;
4447 this .clickHandler = clickHandler ;
@@ -61,6 +64,8 @@ public ItemProvider getItemProvider(Player viewer) {
6164 @ SuppressWarnings ("unchecked" )
6265 @ Override
6366 public void bind (Gui gui ) {
67+ if (!guiClass .isAssignableFrom (gui .getClass ()))
68+ throw new IllegalArgumentException ("This item can only be bound to a " + guiClass .getSimpleName ());
6469 bindHandler .accept (this , (G ) gui );
6570 super .bind (gui );
6671 }
@@ -105,6 +110,7 @@ public void removeViewer(AbstractWindow<?> who, int how) {
105110
106111 non-sealed static class Builder <G extends Gui > implements BoundItem .Builder <G > {
107112
113+ private final Class <? extends Gui > guiClass ;
108114 protected BiConsumer <Item , G > bindHandler = (item , gui ) -> {};
109115 protected BiConsumer <Item , G > unbindHandler = (item , gui ) -> {};
110116 private TriConsumer <Item , G , Click > clickHandler = (item , gui , click ) -> {};
@@ -117,6 +123,10 @@ non-sealed static class Builder<G extends Gui> implements BoundItem.Builder<G> {
117123 private boolean updateOnClick ;
118124 private int updatePeriod = -1 ;
119125
126+ public Builder (Class <? extends Gui > guiClass ) {
127+ this .guiClass = guiClass ;
128+ }
129+
120130 @ Override
121131 public Builder <G > setItemProvider (ItemProvider itemProvider ) {
122132 this .itemProviderFn = (viewer , gui ) -> itemProvider ;
@@ -229,6 +239,7 @@ public BoundItem build() {
229239 CustomBoundItem <G > customItem ;
230240 if (asyncPlaceholder != null && itemProviderFn != null ) {
231241 customItem = new CustomBoundItem <>(
242+ guiClass ,
232243 bindHandler ,
233244 unbindHandler ,
234245 clickHandler ,
@@ -254,6 +265,7 @@ public BoundItem build() {
254265 }
255266 } else {
256267 customItem = new CustomBoundItem <>(
268+ guiClass ,
257269 bindHandler ,
258270 unbindHandler ,
259271 clickHandler ,
@@ -271,6 +283,8 @@ public BoundItem build() {
271283 static class Paged extends Builder <PagedGui <?>> {
272284
273285 Paged () {
286+ super (PagedGui .class );
287+
274288 var pageChangeHandler = new AtomicReference <BiConsumer <Integer , Integer >>();
275289 var pageCountChangeHandler = new AtomicReference <BiConsumer <Integer , Integer >>();
276290
@@ -292,6 +306,8 @@ static class Paged extends Builder<PagedGui<?>> {
292306 static class Scroll extends Builder <ScrollGui <?>> {
293307
294308 Scroll () {
309+ super (ScrollGui .class );
310+
295311 var scrollHandler = new AtomicReference <BiConsumer <Integer , Integer >>();
296312 var lineCountChangeHandler = new AtomicReference <BiConsumer <Integer , Integer >>();
297313
@@ -314,6 +330,8 @@ static class Scroll extends Builder<ScrollGui<?>> {
314330 static class Tab extends Builder <TabGui > {
315331
316332 Tab () {
333+ super (TabGui .class );
334+
317335 var tabChangeHandler = new AtomicReference <BiConsumer <Integer , Integer >>();
318336
319337 bindHandler = bindHandler .andThen ((item , gui ) -> {
0 commit comments